在開始今天的主題前,我們先來說一個蠻經典的故事:
有一天,有一個旅人來到一個路口,前面有兩條路,其中一條通向誠實村,而另一條擇通向說謊村。
在誠實村裡,所有人都只會講真話,而在說謊村裡,所有的人都會只講謊話。
為了能讓旅人順利到達誠實村,誠實村的人派了一位村民前去接待,而說謊村的村民為了拐騙這位旅人,也派了一位村民前去接待這位旅人。
旅人在路上遇到了前來接待的村民,卻不知道這位村民到底是誠實村還是說謊村派來的。
旅人應該詢問這位村民什麼問題,才能確保自己無論如何都能抵達誠實村呢?
(答案在文末)
布林值 Boolean 像是我們小時候最喜歡的是非題,只有真值 True
與假值 False
,沒有中間曖昧不明的數值。(通常老師會送分,喂!)
a = True
b = False
print(a) # True
print(b) # False
其實我一直不太瞭解「運算子」的「子」究竟是什麼意思,趁著這機會也詢問了一下 GPT 老師,根據老師的說法:
「運算子」是一個由「運算」和「子」組成的詞語。
其中「運算」指的是數學或邏輯上的計算過程,「子」通常用來表示這個概念的具體實現或元素。
所以「運算子」指的是在運算過程中使用的符號或詞語,如加法+
、減法-
、乘法*
、除法/
等,它們在數學或邏輯中用來進行操作的基本單位。
簡單來說,「運算子」的「子」字用來強調這些符號或詞語在運算過程中的作用,是「運算」的具體實現或部分。
講了那麼多,用白話文解釋運算子就是「用來運算的符號」,而 Python 中除了常見的算數運算子(即「加減乘除」),還有其他的幾種運算子。
+
): a + b
-
): a - b
*
): a * b
/
): a / b
%
): a % b
//
): a // b
**
): a ** b
在復健第二天:內建函數與變數中,我們有提及可以使用等號 =
進行變數的賦值,而這個「等號 =
」實際上就是賦值運算子。
同時我們也可以將 =
與前面的算數運算子做結合,產生出其他的賦值運算子,例如:
+=
:x += 3
等同於 x = x + 3
-=
:x -= 3
等同於 x = x - 3
*=
:x *= 3
等同於 x = x * 3
/=
:x /= 3
等同於 x = x / 3
用於比較兩個值,結果會是布林值(True
或 False
),例如:
==
:等於(x == y
)!=
:不等於(x != y
)>
:大於(x > y
)<
:小於(x < y
)>=
:大於或等於(x >= y
)<=
:小於或等於(x <= y
)用來檢查某個值是否在串列(物件)中:
in
:如果某個值存在於串列(物件)中返回 True
not in
:如果某個值不存在於串列(物件)中返回 True
print('a' in 'an') # True
用來比較兩個對象是否為同一個對象,比較的是記憶體裡的位置是否相同:
is
:如果兩個變數引用的是同一個對象則返回 True
is not
:如果兩個變量引用的不是同一個對象則返回 True
print(1 is 1) # True
print(1 is not 2) # True
邏輯運算子主要用於「布林值的邏輯運算」,主要有:
and
:當兩個條件都為真時結果為真or
:當其中至少一個條件為真時結果為真not
:對運算結果的布林值進行反轉print(3 > 2 and 4 > 3) # True
print(3 > 2 or 4 < 3) # True
print(not False) # True
這個是我覺得最難理解的運算子,對於初學者來說也比較不容易使用到。
簡單來說,位元運算將數字轉為二進位,然後執行按位與操作。(真的看不懂也沒關係,未來有需要再認識即可!)
&
: 按位與運算 bitwise AND&
對兩個數字的每一位執行按位與操作。如果對應位都為 1
,則結果為 1
,否則為 0
。|
: 按位或運算 bitwise OR|
對兩個數字的每一位執行按位或操作。如果對應位中至少有一位是 1
,則結果為 1
,否則為 0
。^
: 按位異或運算 bitwise XOR^
對兩個數字的每一位執行按位異或操作。如果對應位不同,則結果為 1
,如果對應位相同,則結果為 0
。>>
: 右移運算 bitwise right shift>>
將數字的二進制表示向右移動指定的位數。移動後左邊的空位由 0
補充,右邊移出的位置被丟棄。<<
: 左移運算 bitwise left shift<<
將數字的二進制表示向左移動指定的位數。移動後右邊的空位由 0
補充,左邊移出的位數被丟棄。a = 5 # 0101
b = 3 # 0011
print(a & b) # 1 (0001)
print(a | b) # 7 (0111)
print(a ^ b) # 6 (0110)
打這篇文章的時候,我差那麼一點點就要放棄鐵人賽(才第三天會不會太快?),因為我在打了一個多小時之後,不小心手賤按了這個小鈴鐺按鈕,沒想到它竟然直接進行了網頁的跳轉,再按上一頁時,只剩下標題與空蕩蕩的內文,那個時候已經是萬念俱灰,只能說 iThome 您能不能開發一個自動存草稿的功能呀,在 23:10 發現全部要重來,只能寫個慘字了!
萬惡的小鈴鐺
(說謊村與誠實村的解答)
旅人只要對接待的村民問:「哪一條路是通往你村莊的道路呢?」
此時若是誠實村的村民,會誠實地帶旅人去誠實村。
此時若是說謊村的村民,為了不帶旅人去自己的村莊(說謊村),也會帶旅人去誠實村。